package model.dao;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;

import org.hibernate.Criteria;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;

import model.bean.Ambiente;
import model.bean.Dispositivo;
import model.bean.Participante;
import model.factory.HibernateUtil;
import model.interfaces.IDispositivo;

public class DispositivoDAO implements IDispositivo {

	private Session session;

	@Override
	// correto
	public void cadastraDispositivo(Dispositivo dispositivo) {
		try {
			session = HibernateUtil.getSession();
			Transaction tx = session.beginTransaction();
			session.saveOrUpdate(dispositivo);
			tx.commit();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	
	
	@Override
	// correto
	public void removeDispositivoByNome(String nomeDispositivo) {
		session = HibernateUtil.getSession();
		Transaction tx = session.beginTransaction();
		String hql = " DELETE FROM Dispositivo d WHERE d.nome LIKE :nomeDispositivo ";
		Query q = session.createQuery(hql);
		q.setString("nomeDispositivo", nomeDispositivo);
		q.executeUpdate();
		tx.commit();
	}
	
	@Override
	public void removerDispositivoPeloId(int idDispositivo) {
		session = HibernateUtil.getSession();
		Transaction tx = session.beginTransaction();
		String hql = " DELETE FROM Dispositivo d WHERE p.dispositivoId = :idDispositivo ";
		Query q = session.createQuery(hql);
		q.setInteger("idDispositivo", idDispositivo);
		q.executeUpdate();
		tx.commit();
		
	}

	@Override
	public void vinculaAmbienteDispositivoPeloNome(String nomeAmbiente,
			String nomeDispositivo) {
		session = HibernateUtil.getSession();
		Transaction tx = session.beginTransaction();
		String sql = " INSERT INTO ambiente_dispositivo VALUES ( "
				+ " (SELECT DISTINCT disp.id_dispositivo FROM dispositivo disp WHERE disp.nome LIKE :nomeDispositivo) , "
				+ " (SELECT DISTINCT amb.id_ambiente FROM ambiente amb WHERE amb.nome LIKE :nomeAmbiente ) "
				+ " )";
		Query q = session.createSQLQuery(sql);// .setResultTransformer(Criteria.ALIAS_TO_ENTITY_MAP);
		q.setString("nomeDispositivo", nomeDispositivo);
		q.setString("nomeAmbiente", nomeAmbiente);
		q.executeUpdate();
		tx.commit();

	}

	@Override
	public void vinculaAmbienteDispositivoPeloId(int idAmbiente,
			int idDispositivo) {
		session = HibernateUtil.getSession();
		Transaction tx = session.beginTransaction();
		String sql = " INSERT INTO ambiente_dispositivo VALUES (:idDispositivo , :idAmbiente)";
		Query q = session.createSQLQuery(sql);// .setResultTransformer(Criteria.ALIAS_TO_ENTITY_MAP);
		q.setInteger("idDispositivo", idDispositivo);
		q.setInteger("idAmbiente", idAmbiente);
		q.executeUpdate();
		tx.commit();

	}

	@Override
	public Dispositivo findDispositivoById(int idDispositivo) {
		session = HibernateUtil.getSession();
		Query q = session.createQuery("FROM Dispositivo d WHERE d.dispositivoId = :idDispositivo");
		q.setInteger("idDispositivo", idDispositivo);
		return (Dispositivo) q.uniqueResult(); 
	}

}
